package org.jeecg.common.util;


import org.apache.commons.collections4.CollectionUtils;

import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * <h1>if 判断工具类</h1>
 *
 * @author Yafei Song
 * @date 2022/09/14
 */
public class If<T> {

    private boolean value;

    /**
     * 如果
     *
     * @param value 价值
     */
    private If(Boolean value) {
        this.value = value;
    }

    /**
     * @param value 价值
     * @return {@link If}<{@link T}>
     */
    public static <T> If<T> of(boolean value) {
        return new If(value);
    }


    /**
     * 空白
     *
     * @param value 价值
     * @return {@link If}<{@link T}>
     */
    public static <T> If<T> ofBlank(String value) {
        return new If(null == value);
    }

    /**
     * 空
     *
     * @param value 价值
     * @return {@link If}<{@link T}>
     */
    public static <T> If<T> ofNull(Object value) {
        return new If(value == null);
    }

    /**
     * 空
     *
     * @param value 价值
     * @return {@link If}<{@link T}>
     */
    public static <T> If<T> ofEmpty(Collection value) {
        return new If(CollectionUtils.isEmpty(value));
    }

    /**
     * 非空
     *
     * @param value 价值
     * @return {@link If}<{@link T}>
     */
    public static <T> If<T> ofNotEmpty(Collection value) {
        return new If(CollectionUtils.isNotEmpty(value));
    }

    /**
     * 平等
     *
     * @param o1 o1群
     * @param o2 o2
     * @return {@link If}<{@link T}>
     */
    public static <T> If<T> ofEqual(Object o1, Object o2) {
        return new If(o1 != null && o1.equals(o2));
    }


    /**
     * 满足条件
     *
     * @param t    t
     * @param func 函数
     * @return {@link R}
     */
    public <R> R isTrue(T t, @NotNull Function<T, R> func) {
        return this.value ? func.apply(t) : null;
    }

    /**
     * 如果存在
     *
     * @param t      t
     * @param action 行动
     */
    public void ifPresent(T t, @NotNull Consumer<? super T> action) {
        Objects.requireNonNull(t, "value is null");
        action.accept(t);
    }

    /**
     * 集合是真
     * 满足条件的Collection
     *
     * @param t    t
     * @param func 函数
     * @return {@link R}
     */
    public <R> R collectionIsTrue(Collection t, @NotNull Function<? super Collection, R> func) {
        return this.value ? func.apply(t) : null;
    }

    /**
     * 如果存在集合
     * 满足条件的Collection
     *
     * @param t      t
     * @param action 行动
     */
    public void collectionIfPresent(Collection t, @NotNull Consumer<? super Collection> action) {
        Objects.requireNonNull(t, "value is null");
        action.accept(t);
    }



    /**
     * 不满足条件
     *
     * @param t    t
     * @param func 函数
     * @return {@link R}
     */
    public <R> R isNotTrue(T t, @NotNull Function<T, R> func) {
        return !this.value ? func.apply(t) : null;
    }


    /**
     * 集合是不正确
     * 不满足条件
     *
     * @param func       函数
     * @param collection 集合
     * @return {@link R}
     */
    public <R> R collectionIsNotTrue(Collection collection, @NotNull Function<? super Collection, R> func) {
        return !this.value ? func.apply(collection) : null;
    }

    /**
     * 是真把
     *
     * @param supplier 供应商
     * @return {@link T}
     * @throws X x
     */
    public <X extends Throwable> T isTrueThrow(@NotNull Supplier<? extends X> supplier) throws X {
        if (this.value) {
            throw supplier.get();
        } else {
            return null;
        }
    }

    /**
     * 不是真把
     *
     * @param supplier 供应商
     * @return {@link T}
     * @throws X x
     */
    public <X extends Throwable> T isNotTrueThrow(@NotNull Supplier<? extends X> supplier) throws X {
        if (!this.value) {
            throw supplier.get();
        } else {
            return null;
        }
    }


}
